# 导入必要的模块和类
from fastapi import APIRouter, Request, HTTPException
from dotenv import load_dotenv
from anthropic._exceptions import RateLimitError
from app.prompts import SYSTEM_MODIFY_PROMPT
from pydantic import BaseModel
from app.services.deepseek_service import DeepSeekService
from app.routers.deepseek_generate import sanitize_mermaid_diagram

# DeepSeek修改模块
# 本模块提供了基于DeepSeek模型修改Mermaid图表的API端点
# 处理用户的修改指令，调用DeepSeek API修改现有图表，并返回修改后的结果
# 与OpenAI修改模块功能类似，但使用DeepSeek模型进行处理

# 加载环境变量
load_dotenv()

print("========== 初始化 DeepSeek 修改路由 ==========")

# 创建API路由器
router = APIRouter(prefix="/deepseek/modify", tags=["DeepSeek"])

# 初始化服务
deepseek_service = DeepSeekService()
print("已初始化 DeepSeekService 服务")


# 定义请求体模型
class ModifyRequest(BaseModel):
    """
    修改请求的数据模型
    
    Attributes:
        instructions (str): 用户提供的修改指令
        current_diagram (str): 当前的Mermaid图表代码 
        repo (str): GitHub仓库名称
        username (str): GitHub用户名
        explanation (str): 图表的解释文本
        model (str): 使用的模型名称，默认为"deepseek"
        api_key (str | None): 可选的用户提供API密钥
    """
    instructions: str  # 用户提供的修改指令
    current_diagram: str  # 当前的图表代码
    repo: str  # 仓库名称
    username: str  # 用户名
    explanation: str  # 图表的解释说明
    model: str = "deepseek" # 默认使用deepseek模型
    api_key: str | None = None # 可选的API密钥


# 定义POST请求处理函数
@router.post("")
async def modify(request: Request, body: ModifyRequest):
    """
    处理图表修改请求的API端点
    
    接收用户的修改指令和当前图表，使用DeepSeek模型生成修改后的图表，
    包含验证和错误处理逻辑。
    
    Args:
        request (Request): FastAPI请求对象
        body (ModifyRequest): 包含修改所需信息的请求体
        
    Returns:
        dict: 包含修改后的图表或错误信息的字典
    """
    print(f"[DeepSeek] 修改请求: 用户名={body.username}, 仓库={body.repo}, 指令长度={len(body.instructions)}, 模型={body.model}")
    try:
        # 检查指令和图表是否存在
        if not body.instructions or not body.current_diagram:
            print("[DeepSeek] 错误: 缺少指令或当前图表")
            return {"error": "Instructions and/or current diagram are required"}
        
        # 检查指令长度是否超过限制
        elif len(body.instructions) > 1000:
            print("[DeepSeek] 错误: 指令长度超过限制")
            return {"error": "Instructions exceed maximum length of 1000 characters"}

        # 检查是否为示例仓库
        if body.repo in [
            "fastapi",
            "streamlit",
            "flask",
            "api-analytics",
            "monkeytype",
        ]:
            print("[DeepSeek] 错误: 示例仓库不允许修改")
            return {"error": "Example repos cannot be modified"}

        print("[DeepSeek] 开始调用API修改图表")
        
        # 调用DeepSeek API修改图表
        modified_mermaid_code = deepseek_service.call_deepseek_api(
            system_prompt=SYSTEM_MODIFY_PROMPT,
            data={
                "instructions": body.instructions,
                "explanation": body.explanation,
                "diagram": body.current_diagram,
            },
            api_key=body.api_key,
            model=body.model,
        )
        
        print(f"[DeepSeek] API调用完成: 修改后代码长度={len(modified_mermaid_code)}")

        # 检查返回结果是否包含"BAD_INSTRUCTIONS"标记
        if "BAD_INSTRUCTIONS" in modified_mermaid_code:
            print("[DeepSeek] 错误: 无效或不明确的指令")
            return {"error": "Invalid or unclear instructions provided"}
            
        # 返回修改后的图表代码
        print("[DeepSeek] 修改成功, 返回修改后的图表")
        return {"diagram": modified_mermaid_code}
        
    # 捕获API速率限制异常
    except RateLimitError as e:
        # 抛出HTTP 429异常，表示请求过多
        print(f"[DeepSeek] 速率限制错误: {str(e)}")
        raise HTTPException(
            status_code=429,
            detail="Service is currently experiencing high demand. Please try again in a few minutes.",
        )
    # 捕获所有其他异常
    except Exception as e:
        # 返回错误信息
        print(f"[DeepSeek] 处理过程中出错: {str(e)}")
        return {"error": str(e)} 